package com.will.willaicodemother.core.saver;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.will.willaicodemother.ai.enums.CodeGenTypeEnum;
import com.will.willaicodemother.constant.AppConstant;
import com.will.willaicodemother.exception.BusinessException;
import com.will.willaicodemother.exception.ErrorCode;

import java.io.File;
import java.nio.charset.StandardCharsets;

/**
 * @author will
 * @since 2025/8/8 17:05
 * 代码保存模板
 */
public abstract class CodeFileSaverTemplate<T> {

    // 文件保存根目录
    private static final String FILE_SAVE_ROOT_DIR = AppConstant.CODE_OUTPUT_ROOT_DIR;

    /**
     * 模板方法，保存代码的标准流程
     *
     * @param result 代码结果对象
     * @return 保存后的文件
     */
    public final File saveCode(T result, Long appId) {
        //1. 校验输入
        validateInput(result);
        //2. 构建唯一目录
        String baseDirPath = buildUniqueDir(appId);
        //3. 保存文件（具体实现交给子类）
        saveFiles(baseDirPath, result);
        //4. 返回保存的目录对象
        return new File(baseDirPath);
    }

    protected void validateInput(T result) {
        if (result == null) {
            throw new BusinessException(ErrorCode.SYSTEM_ERROR, "保存结果为空");
        }
    }

    /**
     * 构建唯一目录路径：tmp/code_output/bizType_appId
     */
    private String buildUniqueDir(Long appId) {
        if (appId == null){
            throw new BusinessException(ErrorCode.PARAMS_ERROR, "appId不能为空");
        }
        String bizType = getCodeGenType().getValue();
        String uniqueDirName = StrUtil.format("{}_{}", bizType, appId);
        String dirPath = FILE_SAVE_ROOT_DIR + File.separator + uniqueDirName;
        FileUtil.mkdir(dirPath);
        return dirPath;
    }

    /**
     * 写入单个文件
     */
    protected final void writeToFile(String dirPath, String filename, String content) {
        if (StrUtil.isNotBlank( content)){
            String filePath = dirPath + File.separator + filename;
            FileUtil.writeString(content, filePath, StandardCharsets.UTF_8);
        }
    }

    /**
     * 获取代码生成类型（交给子类实现）
     */
    protected abstract CodeGenTypeEnum getCodeGenType();

    /**
     * 保存文件(具体实现交给子类)
     */
    protected abstract void saveFiles(String uniqueDirPath, T result);
}
